#ifndef CLASE_H_
#define CLASE_H_

#include <vector>
#include "model/clases/ComponentClases.h"
#include "Atributo.h"
#include "Metodo.h"
#include "TipoDato.h"
#include "Interfaz.h"
#include <map>

enum ClassType{
	NORMAL,
	INTERFACE,
	ABSTRACT
};

class Clase: public ComponentClasses {

private:
	std::vector<Atributo*> m_atributos;
	std::vector<Metodo*> m_metodos;
	bool connectorsRefreshed;
	enum ClassType m_classType;
	std::string m_type;

	std::map<int, int> m_mapeoDeIdDeConectorEntidadAConectorClases;
	std::map<int, int> m_mapeoDeIdDeConectorRelacionAConectorClases;


public:

	Clase(const std::string & name = "clase");

	Clase(const Clase &);

	Clase& operator=(const Clase& otro);

	void addAtributo(Atributo* atr);

	void addMetodo(Metodo* met);

	std::vector<Atributo*> getAtributos();

	std::vector<Metodo*> getMetodos();

	void intercambiarAtributos(std::vector<Atributo*> nuevos);

	void intercambiarMetodos(std::vector<Metodo*> nuevos);

	virtual void serialize(XmlWriter & writer_rep, XmlWriter & writer_comp);

	virtual void deserialize(XmlReader & reader);

	virtual void deserialize(XmlReader & reader, XmlReader& readerModel);

	virtual void update();

	virtual void validate(std::fstream & filestr, bool &valido);

	std::string description();

	void initializeConnectors();

	void refreshConnectors(int widthBox, int heightBox);

	void setClassType(enum ClassType c);

	std::string getClassTypeString() const;

	enum ClassType getClassType() const;

	virtual ~Clase(){};

	int indiceDeConectorParaIdDeConectorDeEntidad(unsigned int id);
	int indiceDeConectorParaIdDeConectorDeRelacion(unsigned int id);

};

#endif /* CLASE_H_ */
